package algorithms.que13;

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

import java.util.Stack;

/**
 * @功能
 * @创建时间 2020/7/3
 */
public class que10 {
    public static void main(String[] args) {
        Stack<String> operatorStack = new Stack<String>();
        String w = "(((1+2*5-4)*(3-4)*(5-6))*4)";  // 读取字符串，每次一个，以空格隔开；
        char[] c = w.toCharArray();
   //     while (!StdIn.isEmpty()) {
                for(char d:c){
            String str = String.valueOf(d);
   //         String str = StdIn.readString();
            //若是（直接压入栈
            if (str.equals("("))
                operatorStack.push(str);
            //运算符号，若栈非空，指向最后添加的值，判断这个值是否是（并判断上次的运算符等级是否低于当前运算符，若是则后置为true
            else if (str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/")) {
                boolean isEmpty;
                boolean isLeftParen;
                boolean isLowerOperator;
                isEmpty = operatorStack.isEmpty();
                isLeftParen = false;
                isLowerOperator = false;
                if (!isEmpty) {
                    String stackTop = operatorStack.peek();
                    isLeftParen = operatorStack.peek().equals("(");
                    if ((stackTop.equals("+") || stackTop.equals("-")) && (str.equals("*") || str.equals("/"))) {
                        isLowerOperator = true;
                    }
                }
                //如果非空且不是左括号且不是低于运算符号则直接取出并打印这个值
                if (!(isEmpty || isLeftParen || isLowerOperator)) {
                    //当打印完最后一个计算符号剩下的刚好是括号的数量,而括弧数量不能大于运算符数量
                    for (int i = 0; i < operatorStack.size(); i++) {
                        String a=operatorStack.pop();
                        StdOut.print(a);

                    }
                }
                //是空的则直接将数据压入栈
                operatorStack.push(str);
                //如果是）取出新添加的值打印，若取出的值是（则继续往前取
            } else if (str.equals(")")) {
                String pop = operatorStack.pop();
                while (!pop.equals("(")) {
                    StdOut.print(pop);
                    pop = operatorStack.pop();
                }
            } else {
                //否则直接打印当前值
                StdOut.print(str);
            }
        }
        //打印栈剩余的符号
        for (String str : operatorStack) {
            StdOut.print(str);
        }

    }

}
